<?php

namespace Usuarios\Controller;

use Zend\Mvc\Controller\AbstractActionController,
    Zend\View\Model\ViewModel;

use Usuarios\Model\Usuario;
use Usuarios\Model\Alumno;
use Usuarios\Model\Profesor;
use Usuarios\Model\Funcionario;

use Usuarios\Form\UsuarioForm;
use Usuarios\Form\SearchForm;

class UsuarioController extends AbstractActionController {

   protected $usuarioTable;
   protected $alumnoTable;
   protected $profesorTable;
   protected $funcionarioTable;
   protected $perfilTable;
   protected $usuarioXperfilTable;

   private function checkLogin() {
      if (! $this->getServiceLocator()
                 ->get('AuthService')->hasIdentity()){
         return $this->redirect()->toRoute('login');
      }
   }

   private function checkRole() {

      $username = $this->getServiceLocator()->get('AuthService')->getIdentity();
      $usuario = $this->getUsuarioTable()->getUsuarioByUserName($username);

      $path = $this->getRequest()->getUri()->getPath();
      if ($path[0] != '/') $path = '/' . $path;
      $pieces = explode("/",$path);
      $module = $pieces[1]; $action = $pieces[2];
      if ($action == "") $action = "index";

      if (! $this->getServiceLocator()
                 ->get('RoleService')->hasPermission($usuario->id,$module,$action)) {

         return $this->redirect()->toRoute('restringido');
      }

   }

   public function indexAction() {

      $this->checkLogin();
      $this->checkRole();

      $this->getAlumnoTable()->deleteMissingIDs();
      $this->getProfesorTable()->deleteMissingIDs();
      $this->getFuncionarioTable()->deleteMissingIDs();

      $form = new SearchForm();
      $form->get('submit')->setValue('Buscar');

      $usuarios = array();
      $request = $this->getRequest();
      if ($request->isPost()) {
         $data = $request->getPost();
         if (strlen($data['nombre']) == 0 && strlen($data['apellido']) == 0)
            $usuarios = $this->getUsuarioTable()->fetchAll();
         else
            $usuarios = $this->getUsuarioTable()->searchUsersByName($data['nombre'],$data['apellido']);
      }

/*      return new ViewModel(array(
         'usuarios' => $this->getUsuarioTable()->fetchAll(),
      )); */

       return array(
          'form' => $form,
          'usuarios' => $usuarios,
       );


   }

   private function synIds($usuario,$data) {
      if ($data['alumno'] == "off" && !is_null($usuario->matricula)) $usuario->matricula = null;
      if ($data['profesor'] == "off" && !is_null($usuario->id_profesor)) $usuario->id_profesor = null;
      if ($data['funcionario'] == "off" && !is_null($usuario->id_funcionario)) $usuario->id_funcionario = null;

      $this->insertIds($usuario,$data);
   }

   private function insertIds($usuario,$data) {

      if ($data['alumno'] == "on" && is_null($usuario->matricula)) {
         $alumno = new Alumno();
         $this->getAlumnoTable()->saveAlumno($alumno);
         $last_alumno = $this->getAlumnoTable()->getlastAlumno();
         $usuario->setMatricula($last_alumno->matricula);
      } else $usuario->setMatricula(null);
      if ($data['profesor'] == "on" && is_null($usuario->id_profesor)) {
         $profesor = new Profesor();
         $this->getProfesorTable()->saveProfesor($profesor);
         $last_profesor = $this->getProfesorTable()->getlastProfesor();
         $usuario->setIdProfesor($last_profesor->id);
      } else $usuario->setIdProfesor(null);
      if ($data['funcionario'] == "on" && is_null($usuario->id_funcionario)) {
         $funcionario = new Funcionario();
         $this->getFuncionarioTable()->saveFuncionario($funcionario);
         $last_funcionario = $this->getFuncionarioTable()->getlastFuncionario();
         $usuario->setIdFuncionario($last_funcionario->id);
      } else $usuario->setIdFuncionario(null);

   }

   private function isDateValid($date) {
      list($y, $m, $d) = explode('-', $date);
      return checkdate($m, $d, $y);
   }

   public function agregarAction() {

      $this->checkLogin();
      $this->checkRole();

      $form = new UsuarioForm();
      $form->get('submit')->setValue('Agregar');

      $request = $this->getRequest();
      if ($request->isPost()) {
         $usuario = new Usuario();
         $form->setInputFilter($usuario->getInputFilter());
         $form->setData($request->getPost());

         if ($form->isValid()) {

            $data = $form->getData();
            $usuario->exchangeArray($data);
            if ($data['funcionario'] == "off" && $data['profesor'] == "off" && $data['alumno'] == "off") {
               echo "
                  <script language='JavaScript'>
                     alert('ERROR: Seleccione al menos un rol de usuario');
                  </script>
               ";
            } else if ($data['password'] != $data['password_confirm']) {
               echo "
                  <script language='JavaScript'>
                     alert('ERROR: Las contraseñas no coinciden');
                  </script>
               ";
            } else if (!$this->isDateValid($data['fecha_nacimiento'])) {
               echo "
                  <script language='JavaScript'>
                     alert('ERROR: Fecha NO valida / El formato correcto es: año-mes-dia ej. \"1985-10-31\"');
                  </script>
               ";
            } else {
               $usuario->matricula = null;
               $usuario->id_profesor = null;
               $usuario->id_funcionario = null;
               $this->insertIds($usuario,$data);
               $this->getUsuarioTable()->saveUsuario($usuario);

               //Redirect to list of usuarios
               return $this->redirect()->toRoute('usuarios');
            }

         }
      }
      return array('form' => $form);
   }

   public function editarAction() {

      $this->checkLogin();
      $this->checkRole();

      $id = (int) $this->params()->fromRoute('id', 0);
      if (!$id) {
         return $this->redirect()->toRoute('usuarios', array(
            'action' => 'agregar'
         ));
      }

      // Get the Usuario with the specified id. An exception is thrown
      // if cannot be found, in which case go to the  index page.
      try {
         $usuario = $this->getUsuarioTable()->getUsuario($id);
      } catch(\Exception $ex) {
         return $this->reditect()->toRoute('usuarios', array(
            'action' => 'index'
         ));
      }

      $form = new UsuarioForm();
      $form->bind($usuario);
      $form->get('submit')->setAttribute('value', 'Editar');

      $request = $this->getRequest();
      if ($request->isPost()) {
         $form->setInputFilter($usuario->getInputFilter());
         $form->setData($request->getPost());

         if ($form->isValid()) {
            $data = $request->getPost();
            //var_dump($data);
            if ($data['funcionario'] == "off" && $data['profesor'] == "off" && $data['alumno'] == "off") {
               echo "
                  <script language='JavaScript'>
                     alert('ERROR: Seleccione al menos un rol de usuario');
                  </script>
               ";
            } else if ($data['password'] != $data['password_confirm']) {
               echo "
                  <script language='JavaScript'>
                     alert('ERROR: Las contraseñas no coinciden');
                  </script>
               ";
            } else if (!$this->isDateValid($data['fecha_nacimiento'])) {
               echo "
                  <script language='JavaScript'>
                     alert('ERROR: Fecha NO valida');
                  </script>
               ";
            } else {

               $this->synIds($usuario,$data);
               $this->getUsuarioTable()->saveUsuario($form->getData());

               //Redirect to list of usuarios
               return $this->redirect()->toRoute('usuarios');
            }
         }
      }

      return array(
         'id' => $id,
         'form' => $form,
         'usuario' => $usuario,
      );
   }

   public function eliminarAction() {

      $this->checkLogin();
      $this->checkRole();

      $id = (int) $this->params()->fromRoute('id', 0);
      if (!$id) {
         return $this->redirect()->toRoute('usuarios');
      }

      $request = $this->getRequest();
      if ($request->isPost()) {
         $del = $request->getPost('del', 'No');

         if ($del == 'Si') {
            $id = (int) $request->getPost('id');

            //primero borrar todos los perfiles asociados al usuario en la tabla usuario_perfil
            $perfiles = $this->getPerfilTable()->getPerfilesByUsuario($id);
            foreach($perfiles as $perfil) {
               if (!is_null($perfil->id_usuario_perfil))
                  $this->getUsuarioXPerfilTable()->deleteUsuarioXPerfil($perfil->id_usuario_perfil);
            }

            $this->getUsuarioTable()->deleteUsuario($id);
         }

         //Redirect to list of usuarios
         return $this->redirect()->toRoute('usuarios');
      }

      return array(
         'id' => $id,
         'usuario' => $this->getUsuarioTable()->getUsuario($id)
      );
   }

   public function getUsuarioTable() {
      if (!$this->usuarioTable) {
         $sm = $this->getServiceLocator();
         $this->usuarioTable = $sm->get('Usuarios\Model\UsuarioTable');
      }
      return $this->usuarioTable;
   }

   public function getAlumnoTable() {
      if (!$this->alumnoTable) {
         $sm = $this->getServiceLocator();
         $this->alumnoTable = $sm->get('Usuarios\Model\AlumnoTable');
      }
      return $this->alumnoTable;
   }

   public function getProfesorTable() {
      if (!$this->profesorTable) {
         $sm = $this->getServiceLocator();
         $this->profesorTable = $sm->get('Usuarios\Model\ProfesorTable');
      }
      return $this->profesorTable;
   }

   public function getFuncionarioTable() {
      if (!$this->funcionarioTable) {
         $sm = $this->getServiceLocator();
         $this->funcionarioTable = $sm->get('Usuarios\Model\FuncionarioTable');
      }
      return $this->funcionarioTable;
   }

   public function getPerfilTable() {
      if (!$this->perfilTable) {
         $sm = $this->getServiceLocator();
         $this->perfilTable = $sm->get('Roles\Model\PerfilTable');
      }
      return $this->perfilTable;
   }

   public function getUsuarioXPerfilTable() {
      if (!$this->usuarioXperfilTable) {
         $sm = $this->getServiceLocator();
         $this->usuarioXperfilTable = $sm->get('Roles\Model\UsuarioXPerfilTable');
      }
      return $this->usuarioXperfilTable;
   }

}
